/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.webhomesites.padrao.presenter;

import br.com.webhomesites.configuracao.model.CidadeDAO;
import br.com.webhomesites.configuracao.model.CidadeModel;
import br.com.webhomesites.configuracao.model.EstadoDAO;
import br.com.webhomesites.configuracao.model.EstadoModel;
import br.com.webhomesites.padrao.contracts.IFornecedorPresenter;
import br.com.webhomesites.padrao.model.BuscarFornecedorModel;
import br.com.webhomesites.padrao.model.FornecedorDAO;
import br.com.webhomesites.padrao.model.FornecedorModel;
import br.com.webhomesites.padrao.presenter.FornecedorPresenterActionListeners.AlterarActionListener;
import br.com.webhomesites.padrao.presenter.FornecedorPresenterActionListeners.BuscaAvancadaActionlistener;
import br.com.webhomesites.padrao.presenter.FornecedorPresenterActionListeners.CampoKeyListener;
import br.com.webhomesites.padrao.presenter.FornecedorPresenterActionListeners.CancelarActionListener;
import br.com.webhomesites.padrao.presenter.FornecedorPresenterActionListeners.InserirActionListener;
import br.com.webhomesites.padrao.presenter.FornecedorPresenterActionListeners.ItemChangedListener;
import br.com.webhomesites.padrao.presenter.FornecedorPresenterActionListeners.ItemEstadoListener;
import br.com.webhomesites.padrao.presenter.FornecedorPresenterActionListeners.RemoverActionListener;
import br.com.webhomesites.padrao.presenter.FornecedorPresenterActionListeners.SairActionListener;
import br.com.webhomesites.padrao.presenter.FornecedorPresenterActionListeners.SalvarActionListener;
import br.com.webhomesites.padrao.utils.GenericValidator;
import br.com.webhomesites.padrao.utils.Strategy;
import br.com.webhomesites.padrao.utils.Validator;
import br.com.webhomesites.padrao.view.BuscarFornecedorView;
import br.com.webhomesites.padrao.view.FornecedorView;
import java.util.regex.Matcher;
import javax.swing.JOptionPane;

/**
 *
 * @author Webhome
 */
public class FornecedorPresenter implements IFornecedorPresenter {

    private FornecedorModel fornecedorModel;
    private FornecedorDAO fornecedorDAO;
    private FornecedorView fornecedorView;
    private CidadeModel cidadeModel;
    private EstadoModel estadoModel;
    private EstadoDAO estadoDAO;
    private CidadeDAO cidadeDAO;
    public final Strategy INSERT_STRATEGY = new InsertStrategy();
    public final Strategy UPDATE_STRATEGY = new UpdateStrategy();
    public final Strategy REMOVE_STRATEGY = new UpdateStrategy();
    private Strategy operacao = INSERT_STRATEGY;
    private Validator<FornecedorModel> validador = new GenericValidator<>();
    public static boolean validado = false;

    public FornecedorPresenter(FornecedorModel fornecedorModel, FornecedorView fornecedorView, FornecedorDAO fornecedorDAO, CidadeModel cidadeModel, EstadoModel estadoModel, EstadoDAO estadoDAO, CidadeDAO cidadeDAO) {
        this.fornecedorModel = fornecedorModel;
        this.fornecedorView = fornecedorView;
        this.fornecedorDAO = fornecedorDAO;
        this.estadoModel = estadoModel;
        this.cidadeModel = cidadeModel;
        this.cidadeDAO = cidadeDAO;
        this.estadoDAO = estadoDAO;
    }

    @Override
    public void setUpViewListeners() {
        fornecedorView.setInserirActionListener(new InserirActionListener(this));
        fornecedorView.setRemoverActionListener(new RemoverActionListener(this));
        fornecedorView.setAlterarActionListener(new AlterarActionListener(this));
        fornecedorView.setCancelarActionListener(new CancelarActionListener(this));
        fornecedorView.setSalvarActionListener(new SalvarActionListener(this));
        fornecedorView.setBtnSairActionListener(new SairActionListener());

        fornecedorView.setMascaraListener(new CampoKeyListener(this));
        fornecedorView.setRbPessoaFisicaActionListener(new ItemChangedListener(this));
        fornecedorView.setRbPessoaJuridicaActionListener(new ItemChangedListener(this));

        fornecedorView.setComboEstadoActionListener(new ItemEstadoListener(this));

        fornecedorView.setBuscaAvancadaActionListener(new BuscaAvancadaActionlistener(this));
    }

    @Override
    public void updateModelFromView() {
        fornecedorModel.setId(fornecedorView.getCodigo());
        fornecedorModel.setPessoa(fornecedorView.getPessoa());
        System.out.println("Pessoa: " + fornecedorView.getPessoa());
        fornecedorModel.setNome(fornecedorView.getNome());
        switch (fornecedorModel.getPessoa()) {
            case "F":
                fornecedorModel.setRazaoSocial(null);
                fornecedorModel.setCnpj(null);
                fornecedorModel.setInscricaoEstadual(null);
                fornecedorModel.setCpf(fornecedorView.getCpf());
                fornecedorModel.setRg(fornecedorView.getRg());
                break;
            case "J":
                fornecedorModel.setCpf(null);
                fornecedorModel.setRg(null);
                fornecedorModel.setRazaoSocial(fornecedorView.getRazaoSocial());
                fornecedorModel.setCnpj(fornecedorView.getCnpj());
                fornecedorModel.setInscricaoEstadual(fornecedorView.getInscricaoEstadual());
                break;
        }
        fornecedorModel.setEndereco(fornecedorView.getEndereco());
        fornecedorModel.setBairro(fornecedorView.getBairro());
        fornecedorModel.setCidadeModel(cidadeDAO.findByDescricaoUnica(fornecedorView.getCidade()));
        fornecedorModel.setEstadoModel(estadoDAO.findByDescricaoUnica(fornecedorView.getEstado()));
        fornecedorModel.setTelefone(fornecedorView.getTelefone());
        fornecedorModel.setCelular(fornecedorView.getCelular());
        fornecedorModel.setEmail(fornecedorView.getEmail());
        fornecedorModel.setContato(fornecedorView.getContato());
        fornecedorModel.setObservacao(fornecedorView.getObservacao());        
        
        Matcher mat;
        if (operacao == REMOVE_STRATEGY) {
            fornecedorDAO.delete(fornecedorModel);
            fornecedorView.clearFields();
        } else {
            if (fornecedorModel.getPessoa().equals("F")) {
                try {
                    //if (validador.isCPF(fornecedorModel.getCpf())) {

                        if (validador.validarEntidade(fornecedorView, fornecedorModel)) {
                            if (operacao == INSERT_STRATEGY) {
                                fornecedorDAO.save(fornecedorModel);
                                System.out.println("******Listagem do fornecedor inserido");
                                System.out.println(fornecedorModel.toString());
                            } else if (operacao == UPDATE_STRATEGY) {
                                fornecedorDAO.update(fornecedorModel);
                            }
                            validado = true;
                        }
//                    } else {
//                        JOptionPane.showMessageDialog(fornecedorView, "CPF inválido!");
//                    }
                } catch (Exception e) {
                    JOptionPane.showMessageDialog(fornecedorView, "CPF em formato inválido!");
                }
            }


            if (fornecedorModel.getPessoa().equals("J")) {
                try {
                    if (validador.isCNPJ(fornecedorModel.getCnpj())) {

                        if (validador.validarEntidade(fornecedorView, fornecedorModel)) {
                            if (operacao == INSERT_STRATEGY) {
                                fornecedorDAO.save(fornecedorModel);
                                System.out.println("******Listagem do fornecedor inserido");
                                System.out.println(fornecedorModel.toString());
                            } else if (operacao == UPDATE_STRATEGY) {
                                fornecedorDAO.update(fornecedorModel);
                            } else if (operacao == REMOVE_STRATEGY) {
                                fornecedorDAO.delete(fornecedorModel);
                                fornecedorView.clearFields();
                            }
                            fornecedorModel.toString();
                            validado = true;
                        }
                    } else {
                        JOptionPane.showMessageDialog(fornecedorView, "CNPJ inválido!");
                    }
                } catch (Exception e) {
                    JOptionPane.showMessageDialog(fornecedorView, "CNPJ em formato inválido!");
                }
            }
        }

    }

    @Override
    public void updateViewFromModel() {
        if (fornecedorModel != null) {
            fornecedorView.setCodigo(fornecedorModel.getId());
            fornecedorView.setPessoa(fornecedorModel.getPessoa());
            fornecedorView.setNome(fornecedorModel.getNome());
            fornecedorView.setCpf(fornecedorModel.getCpf());
            fornecedorView.setRg(fornecedorModel.getRg());
            fornecedorView.setRazaoSocial(fornecedorModel.getRazaoSocial());
            fornecedorView.setCnpj(fornecedorModel.getCnpj());
            fornecedorView.setInscricaoEstadual(fornecedorModel.getInscricaoEstadual());
            fornecedorView.setBairro(fornecedorModel.getBairro());
            fornecedorView.setTelefone(fornecedorModel.getTelefone());
            fornecedorView.setCelular(fornecedorModel.getCelular());
            fornecedorView.setEmail(fornecedorModel.getEmail());
            fornecedorView.setEndereco(fornecedorModel.getEndereco());
            fornecedorView.setContato(fornecedorModel.getContato());
            fornecedorView.setObservacao(fornecedorModel.getObservacao());
            fornecedorView.setEstado(fornecedorModel.getEstadoModel().getNome());
            fornecedorView.setCidade(fornecedorModel.getCidadeModel().getNome());
        } else {
            fornecedorView.clearFields();
        }
    }

    @Override
    public void novoFornecedor() {
        validado = false;
        setOperacao(INSERT_STRATEGY);
        fornecedorModel = new FornecedorModel();
        fornecedorView.setCodigo(fornecedorDAO.getMaxId() + 1);
        fornecedorView.setPessoaFisicaSelected(true);
        fornecedorView.enableTxtFornecedorInscricaoEstadual(false);
        fornecedorView.enableTxtFornecedorCnpj(false);
        fornecedorView.enableTxtFornecedorRazaoSocial(false);
    }

    @Override
    public void inserirFornecedor() {
        this.updateModelFromView();

    }

    @Override
    public void alterarFornecedor() {
        this.updateModelFromView();
    }

    @Override
    public void removerFornecedor() {
        setOperacao(REMOVE_STRATEGY);
        this.updateModelFromView();
    }

    @Override
    public void habilitarEdicao(boolean arg) {
        fornecedorView.enableTxtFornecedorCodigo(arg);
        fornecedorView.enableRgFornecedorPessoa(arg);
        fornecedorView.enableTxtFornecedorNome(arg);
        fornecedorView.enableTxtFornecedorRazaoSocial(arg);
        fornecedorView.enableTxtFornecedorCpf(arg);
        fornecedorView.enableTxtFornecedorRg(arg);
        fornecedorView.enableTxtFornecedorCnpj(arg);
        fornecedorView.enableTxtFornecedorInscricaoEstadual(arg);
        fornecedorView.enableTxtFornecedorTelefone(arg);
        fornecedorView.enableTxtFornecedorCelular(arg);
        fornecedorView.enableTxtFornecedorEmail(arg);
        fornecedorView.enableTxtFornecedorEndereco(arg);
        fornecedorView.enableTxtFornecedorBairro(arg);
        fornecedorView.enableComboFornecedorCidade(arg);
        fornecedorView.enableComboFornecedorEstado(arg);

        fornecedorView.enableBtnCancelar(arg);
        fornecedorView.enableBtnRemover(arg);
        fornecedorView.enableBtnSalvar(arg);
    }

    @Override
    public FornecedorView getView() {
        return fornecedorView;
    }

    @Override
    public FornecedorModel getModel() {
        return fornecedorModel;
    }

    @Override
    public void setView(FornecedorView fornecedorView) {
        this.fornecedorView = fornecedorView;
    }

    @Override
    public void setModel(FornecedorModel model) {
        this.fornecedorModel = model;
    }

    @Override
    public void createView() {
        //this.novoFornecedor();            
        this.setUpViewListeners();
        //this.habilitarEdicao(false);  
        fornecedorView.removeAllitensComboFornecedorCidade();
        fornecedorView.removeAllitensComboFornecedorEstado();
        fornecedorView.setListaEstado(estadoDAO.findAll());
        //fornecedorView.setCidade(cidadeDAO.findAllOrdened("nome"));
        fornecedorView.packAndShow();
    }

    public void setOperacao(Strategy operacao) {
        this.operacao = operacao;
    }

    public Strategy getOperacao() {
        return operacao;
    }

    @Override
    public FornecedorDAO getDAO() {
        return this.fornecedorDAO;
    }

    @Override
    public void setDAO(FornecedorDAO dao) {
        this.fornecedorDAO = dao;
    }

    @Override
    public void buscaAvancada() {

        BuscarFornecedorModel buscarFornecedorModel = new BuscarFornecedorModel();

        BuscarFornecedorView buscaFornecedorView = new BuscarFornecedorView(javax.swing.JOptionPane.getFrameForComponent(fornecedorView), true);

        BuscarFornecedorPresenter buscarFornecedorPresenter = new BuscarFornecedorPresenter(this, null, null, buscaFornecedorView, buscarFornecedorModel);
        buscarFornecedorPresenter.setBuscador(buscarFornecedorPresenter.BUSCADOR_CLIENTE_VIEW);
        buscarFornecedorPresenter.createView();

    }

    private class InsertStrategy implements Strategy {

        @Override
        public void execute() {
            inserirFornecedor();
        }
    }

    private class UpdateStrategy implements Strategy {

        @Override
        public void execute() {
            alterarFornecedor();
        }
    }
}
